package cn.lbd.pseudoasynchronous;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服务器
 */
public class Server {
    private static int PORT = 8765;

    public static void main(String[] args) {
        ServerSocket server = null;
        HandlerExecutorPool pool = null;
        try {
            //服务端socket只提供端口
            server = new ServerSocket(PORT);
            System.out.println("server start");
            //服务器上会有一个socket实例
            //监听并接受到此套接字的连接（PORT <=> PORT）,就是一直等待连接,此方法在连接传入之前一直阻塞，直到接受到有socket的连接
            Socket socket = null;
            pool = new HandlerExecutorPool(50,1000);
            while (true) {
                socket = server.accept();
                //将客户端任务投递到线程池去执行
                //区别于BIO方式，BIO是每次开启一个线程去执行一个任务，线程生命周期结束，server也会消亡
                //伪异步IO是通过线程池来执行任务队列，因此池不关闭，server就一直会在，相当于一个长连接。无需三次握手，减少socket连接的开销
                pool.execute(new SocketHandler(socket));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (server !=null){
                try {
                    server.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            /*if (pool != null){
                pool.close();
            }*/
            server = null;
        }
    }
}
